/*! \file vanillaoption.hpp
    \brief Vanilla Employee option on a single asset
*/

#ifndef quantlib_vanilla_emp_option_hpp
#define quantlib_vanilla_emp_option_hpp

#include <ql/instruments/vanillaoption.hpp>
#include <ql/instruments/payoffs.hpp>

namespace QuantLib {

    class BlackScholesMertonHWProcess;

    //! Employee Vanilla option (no discrete dividends, no barriers) on a single asset
    /*! \ingroup instruments */
    class VanillaEmpOption : public VanillaOption 
	{
      public:

        class arguments;
        class engine;

        VanillaEmpOption(const Date &vestingStartDate,
						 const boost::shared_ptr<StrikedTypePayoff>&,
                         const boost::shared_ptr<Exercise>&);

		const Date &vestingStartDate() const { return vestingStartDate_; }

	  protected:
        void setupArguments(PricingEngine::arguments*) const;

	  private:
		  Date vestingStartDate_;
    };

    //! %Arguments for employee vanilla option calculation
    class VanillaEmpOption::arguments : public VanillaOption::arguments 
	{
      public:
        arguments() {}
        void validate() const;
		Date vestingStartDate;
    };

    //! %Employee-vanilla-option %engine base class
    class VanillaEmpOption::engine
        : public GenericEngine<VanillaEmpOption::arguments,
                               VanillaEmpOption::results> {};

}

#endif